<?php
/**
 * 管理员控制器
 * @author July
 */

namespace july\julyadmin\admin\controller;

use july\julyadmin\builder\traits\HasBuilder;
use july\julyadmin\common\model\Admin as AdminModel;

class Test extends Common
{
    use HasBuilder;

    //不需要登录验证的控制器和方法，如：['index']
    protected $noNeedLogin = [];
    //不需要权限验证的控制器和方法，如：['index']
    protected $noPermissionAuth = ['*'];

    public function __construct()
    {
        //重新初始化父类
        parent::initialize();
        //数据模型
        $this->dataModel = new AdminModel();
        //join关联查询的表信息如，['category'=>'inner','comment'=>'left']
        $this->relationWithJoins = ['role' => 'inner'];
        //with预查询关联表信息，如category,comment
        $this->relationWiths = [];
        //页面标题
        $this->pageTitle = '管理员列表';
        //允许表格行内编辑的字段,如name,sex
        $this->allowRowEditField = ['realname', 'disabled'];
        //不允许删除的主键数组，如1,2,3
        $this->noDeletePrimarykeys = [1];
        //不允许编辑的主键数组，如1,2,3
        $this->noEditPrimarykeys = [1];
        //不允许禁用的主键数组，如1,2,3
        $this->noDisabledPrimarykeys = [1];
        //下拉join关联查询的表信息如，['category'=>'inner','comment'=>'left']
        $this->selectRelationWithJoins = [];
        //下拉with预查询关联表信息，如category,comment
        $this->selectRelationWiths = [];
        //下拉列表默认查询条件，如 [['disabled', '=', 1]]，如果有配置了$this->selectRelationWithJoins，这里就需要注意了，排序字段需要带上表名加一个点，如admin.
        $this->selectWhere = [];
        //下拉列表模糊查询字段,如 'name|title'，如果有配置了$this->selectRelationWithJoins，这里就需要注意了，排序字段需要带上表名加一个点，如admin，当前表可以不加
        $this->selectSearch = 'username|realname';
        //下拉列表默认 Text 字段 如 '{id}#{nickname}'或者'id:{id}-名称:{name}'，如果有配置了$this->selectRelationWithJoins，这里就需要注意了，排序字段需要带上表名加一个点，如admin，当前表可以不加
        $this->selectTextField = '{id}#{username}#{realname}';
        //下拉默认id字段,如：id
        $this->selectIdField = 'id';
        //下拉列表查询时的字段，如：id,name，如果有配置了$this->selectRelationWithJoins，这里就需要注意了，排序字段需要带上表名加一个点，如admin.，当前表可以不加
        $this->selectFields = 'id,username,realname';
        //下拉列表父id字段，如：parent_id，如果有配置了$this->selectRelationWithJoins，这里就需要注意了，排序字段需要带上表名加一个点，如admin.
        $this->selectParentId = 'parent_id';
        //下拉列表查询第一层数据列表条件，如[['parent_id','=',0]],当表格为treeTable的时候，意味着你要输出的数据也会是树形的，这个时候首次查询最父层的数据列表可能需要传入这个参数，如果有配置了$this->SelectRelationWithJoins，这里就需要注意了，排序字段需要带上表名加一个点，如admin.
        $this->selectOneParentWhere = [];
        //下拉列表查询排序，如果有配置了$this->selectRelationWithJoins，这里就需要注意了，排序字段需要带上表名加一个点，如admin.
        $this->selectOrder = '';
        //列表排序，如果有配置了$this->relationWithJoins，这里就需要注意了，排序字段需要带上表名加一个点，如admin.
        $this->sort = 'admin.id desc';
        //父id字段名称，如parent_id,当表格为treeTable的时候，意味着你要输出的数据也会是树形的，这个时候需要指定父级字段名称，如果有配置了$this->selectRelationWithJoins，这里就需要注意了，排序字段需要带上表名加一个点，如admin.，根据实际需求修改
        $this->parentField = '';
        //查询第一层数据列表条件，如[['parent_id','=',0]],当表格为treeTable的时候，意味着你要输出的数据也会是树形的，这个时候首次查询最父层的数据列表可能需要传入这个参数，如果有配置了$this->relationWithJoins，这里就需要注意了，排序字段需要带上表名加一个点，如admin.
        $this->oneParentWhere = [];
        //表格类型,table,treeTable
        $this->tableType = 'table';
        //树形表格分组字段，比如name，那么展开和搜索箭头就会在name这一列显示，当表格为treeTable的时候会用到
        $this->treeTableGroupField = '';
        //需要合计的字段，如['显示在哪个字段','显示哪个字段的值']，如果有配置了$this->selectRelationWithJoins，这里就需要注意了，排序字段需要带上表名加一个点，如['id'=>'admin.sex','money'=>admin.money']
        $this->totalRow = ['id' => 'admin.id'];
        //设置主键
        $this->pk = 'id';
    }

    /**
     * 设置当前页面
     * @param $table 表格
     */
    protected function buildPage(&$table = [])
    {
        $table->showLeftTree('roleid', '角色')->dataUrl(url('AdminRole/selectPage'));

        $table->tableTitle($this->pageTitle);
        $table->switchBtnText(['开启', '禁用']);

        //搜索
        $table->getSearch()
            ->size(5, 7)
            ->show('text', 'id', 'ID')
            ->show('text', 'username', '用户名')->placeholder('用户名')
            ->show('text', 'realname', '姓名')->placeholder('姓名')
            ->show('datetime-local', 'create_time', '创建时间')
            ->show('select', 'roleid', '角色')->dataUrl(url("AdminRole/selectPage"));

        //表格工具栏
        $table->getToolbar()
            ->addBtn()
            ->disabledBtn()
            ->deleteBtn()
            ->refreshBtn()
            ->linkBtn('openbaidu', '打开百度', 'javascript:alert(111)', '', 'btn btn-pink')
            ->openWindowBtn('openqq', '打开QQ', 'http://qq.com', '', 'btn btn-pink');

        //自定义工具栏按钮
        $table->addToolbar([
            'title'    => '测试按钮', //按钮标题
            'layEvent' => 'TEST', //按钮事件名称
            'icon'     => 'layui-icon-tips', //按钮图标,layui的图标
            'function' => '
            alert("测试按钮")
            ', //执行js
        ]);

        //表格数据
        $table->totalRow(true);
        $table->showCheckbox();
        $table->show('headportrait', '头像', 'image')->align('center')->width(100)->colTotalRowText("合计");
        $table->show('id', 'ID')->width(100)->sort(true);
        $table->show('username', '用户名')->width(130);
        $table->show('realname', '姓名')->edit('text')->width(130);
        $table->show('disabled', '禁用状态', 'switchBtn')->edit('switchBtn')->width(100);
        $table->show('role.name', '角色')->width(130);
        if (request()->action() == 'export') {
            $table->show('create_time', '创建时间')->width(170)->sort(true);
            $table->show('update_time', '更新时间')->width(170)->sort(true);
        } else {
            $table->show('times', '创建时间/更新时间')->align('center')->to('{create_time}<br>{update_time}')->width(170);
        }
        //表格右侧操作列
        $table->showRowHandleMenus()->width(180);
        $table->getTableRowBtns()
            ->editBtn()
            ->viewBtn()
            ->deleteBtn();
    }

    /**
     * 处理数据
     * 因为查询出来的数据可能需要二次处理
     * @param  array &$data 查询出来的数据
     */
    protected function handleData(&$data = [])
    {

    }

    /**
     * 处理查询条件
     * @param array $search  查询条件
     * @return  array $where
     */
    protected function filterWhere($search = [])
    {
        $where = [];
        foreach ($search as $k => $v) {
            if ($v === "") {
                continue;
            }
            switch ($k) {
                case "id":
                    $where[] = ['admin.id', '=', $v];
                    break;
                case "realname":
                    $where[] = ['admin.realname', 'like', '%' . $v . '%'];
                    break;
                case "username":
                    $where[] = ['admin.username', 'like', '%' . $v . '%'];
                    break;
                case "roleid":
                    if (is_array($v)) {
                        $where[] = ['role.id', 'in', implode(",", $v)];
                    } else {
                        $where[] = ['role.id', '=', $v];
                    }

                    break;
            }
        }

        return $where;
    }

    /**
     * 处理下拉列表查询条件
     * @param  array $where  现有的查询条件
     * @return array
     */
    protected function filterSelectPageWhere($where = [])
    {

        return $where;
    }

    /**
     * 处理合计行信息
     * @Author   July
     * @DateTime 2023-11-16T20:45:54+0800
     * @param    array                   $where    已经处理过的最终查询条件，可以自己覆盖，用来自己重新查询数据
     * @param    integer                 $limit    每页多少条
     * @param    string                  $sort     排序
     * @param    integer                 $page     第几页
     * @param    array                   $totalRow 已经查询出来的合计信息，可以自己覆盖返回
     * @return   array                   $totalRow 将处理过的最终信息返回
     */
    protected function filterTotalRow($where = [], $limit = 20, $sort = '', $page = 1, $totalRow = [])
    {
        return $totalRow;
    }

    /**
     * 构建表单
     * @param $isEdit  是否是编辑
     * @param $data    表单数据
     */
    protected function buildForm(&$form, $isEdit, &$data = [])
    {
        $form->setColWidth(12);
        $form->leftStart(6);
        $form->show('hidden', 'testhidden', '测试隐藏input');
        $form->show('text', 'username', '用户名')->help('登录账号')->required();
        $form->show('text', 'realname', '姓名')->required();
        $form->show('select', 'roleid', '角色')->dataUrl(url("AdminRole/selectPage"))->required()->when([1],
            $form->show('html', 'testwhen1', '测试when1')->default('测试when1内容')
        );
        $form->show('select', 'select1', 'select1')->multiple(true)->options(['1' => 'test1', '2' => 'test2', '3' => 'test3'])->default('1,2')->required()->when([1, 2],
            $form->show('html', 'testwhen2', '测试when2')->default('测试when2内容')
        );
        $form->show('select', 'select2', 'select2')->dataUrl(url("AdminRole/selectPage"))->multiple(false)
            ->withNext(function ($form) {
                $form->show('select', 'select2-2', 'select2-2')->setParentId('select2')->default(51)->showLabel(false)->size(6, 6)->dataUrl(url("AdminRole/selectPage"))->required();
                $form->show('select', 'select2-3', 'select2-3')->setParentId('select2-2')->default(50)->showLabel(false)->size(6, 6)->dataUrl(url("AdminRole/selectPage"))->required();
            })->default('1')->required();

        $form->show('switchBtn', 'disabled', '禁用状态')->default(1)->when(1,
            $form->show('html', 'testwhen3', '测试when3')->default('测试when3内容')
        );
        $form->show('ueditor', 'ueditor', 'ueditor')->required();
        $form->show('checkbox', 'test', 'checkbox')->options([0 => '测试1', 1 => '测试2'])->default('0,1');
        $form->show('radio', 'radio', 'radio')->options([0 => '测试1', 1 => '测试2'])->default(0);
        $form->leftEnd();

        $form->rightStart(6);
        $form->show('iconPicker', 'icon', 'iconPicker')->default('mdi mdi-close-box')->required();
        $form->show('color', 'color', 'color')->default('#ccc333')->required();
        $form->show('number', 'number', 'number')->default(100)->required();
        $form->show('tags', 'tags', 'tags')->default('测试1,测试2')->required();
        $form->show('date', 'date', 'date')->default(date('Y-m-d', time()))->required();
        $form->show('time', 'time', 'time')->default(date('H:i:s', time()))->required();
        $form->show('week', 'week', 'week')->default('2023-W05')->required();
        $form->show('month', 'month', 'month')->default('23:01')->required();
        $form->show('textarea', 'textarea', 'textarea')->default('测试文本域')->required();
        $form->rightEnd();
        $options = [
            ['id' => '1', 'text' => '测试1'],
            ['id' => '3', 'text' => '测试3'],
        ];
        $form->leftStart(6);
        $form->show('jsTree', 'jsTree', 'jsTree')->options($options)->default('1')->required();
        $form->show('image', 'headportrait', 'image')->thumbSize(40, 40)->multiple(false)->required();
        $form->show('file', 'file', 'file')->thumbSize(100, 100)->multiple()->required();
        $form->show('gaodeMap', 'gaodeMap', 'gaodeMap')->default('102.787908,25.052229')->required();
        $form->rightEnd();

        $items = [[
            'roleid'     => 51,
            'select1'    => 1,
            'iconPicker' => 'mdi mdi-abacus',
            'username'   => 'test',
            'color'      => '#666666',
            'number'     => 23,
            'date'       => date('Y-m-d'),
            'time'       => date('H:i:s'),
            'week'       => '2023-W03',
            'month'      => date('Y-m'),
            'textarea'   => 'sadfasdf',
            'test1'      => '0',
            'test2'      => '0',
            'testfile'   => '1111',
            'testimage'  => '2222',
        ]];
        if ($isEdit) {
            $data['items'] = $items;
        }
        $form->show('items', 'items', 'items')->default($items)->size(2, 10)->setColWidth(10)->showRowHandleMenus(true)->addBtn(true)->deleteBtn(true)->style('min-width:3000px;')
            ->with(function ($form, $data) {
                $form->show('select', 'roleid', '角色')->dataUrl(url("AdminRole/selectPage"))->required();
                $form->show('select', 'select1', 'select1')->options(['1' => 'test1', '2' => 'test2', '3' => 'test3'])->default('1,2')->required();
                $form->show('iconPicker', 'iconPicker', '图标选择')->required();
                $form->show('text', 'username', '用户名')->help('登录账号')->required();
                $form->show('color', 'color', '颜色选择')->default('#ccc333')->required();
                $form->show('number', 'number', '数字输入')->default(100)->required();
                $form->show('date', 'date', '日期选择')->required();
                $form->show('time', 'time', '时间选择')->required();
                $form->show('week', 'week', '周选择')->default('2023-W05')->required();
                $form->show('month', 'month', '年月选择')->default('23:01')->required();
                $form->show('textarea', 'textarea', '文本域')->default('测试文本域')->required();
                $form->show('checkbox', 'test1', '多选框')->options([0 => '测试1', 1 => '测试2'])->default('0,1')->required();
                $form->show('radio', 'test2', '单选框')->options([0 => '测试1', 1 => '测试2'])->default('0');
                $form->show('file', 'testfile', '测试文件')->itemsTitleStyle('width:500px;')->multiple()->required();
                $form->show('image', 'testimage', '测试图片')->itemsTitleStyle('width:500px;')->multiple()->required();
            })->required();
    }

    /**
     * 保存
     * @param  integer $isEdit 是否是编辑
     */
    protected function save($isEdit)
    {
        $pk = input("get." . $this->getPk());

        $data = request()->only([
            'username',
            'password',
            'roleid',
            'encrypt',
            'realname',
            'disabled',
            'headportrait',
        ], 'post');

        try {
            validate([
                'username|用户名' => 'require',
                'roleid|角色'    => 'require|number',
                'realname|姓名'  => 'require',
            ])->check($data);
        } catch (\think\exception\ValidateException $e) {
            $this->error($e->getError());
        }

        return $this->doSave($isEdit, $data, $pk);
    }

    public function exportCsv()
    {
        $headers = ['姓名', '年龄', '手机号'];
        $data    = [
            ['张三', '32', '19988461090324234234234234234'],
            ['李四', '11', '19988461091'],
            ['王二', '23', '19988461092'],
            ['张飞', '33', '19988461093'],
            ['刘备', '32', '19988461094'],
        ];
        $export = new \july\julyadmin\common\logic\ExportLogic('测试导出', $headers, $data);
        //判断文件是否存在，已存在的话就用appendData追加，同时header就不会再写入了，当数据太多，一次无法导入的时候，就会需要另作处理，会需要用到这个
        if ($export->csvExists('测试导出')) {
            $export->appendData($data);
        }
        var_dump($export->exportCsv());
    }

    /**
     * 导入文件读取完成执行这里，可以重写这个方法，把data中的数据写到数据库
     * @Author   July
     * @DateTime 2023-10-13T20:56:54+0800
     * @param    integer                  $page 第几页
     * @param    array                    $data excel或者csv数据列表
     * @return   array                    ['code'=>1|0,'msg'=>'']
     */
    public function importSuccess($page = 1, $data = [])
    {
        return ['code' => 1, 'msg' => '导入成功'];

        // return ['code' => 0, 'msg' => "请在控制器中重写importSuccess(\$page = 1,\$data = [])方法，将data中的数据写入数据库，然后返回成功['code'=>1,'msg'=>'']或者失败['code'=>0,'msg'=>'上传失败信息']"];

    }
}
